package com.fhzn.boss.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fhzn.boss.entity.Label;
import com.fhzn.boss.enums.Constants;
import com.fhzn.boss.web.converter.LabelConverter;
import com.fhzn.boss.web.request.LabelQueryRequest;
import com.fhzn.boss.web.vo.LabelExportVO;

import java.util.List;
import java.util.Objects;

/**
 * @author 老顾
 * @apiNote
 * @since 2024/3/25
 */
public interface LabelMapper extends BaseMapper<Label> {

    /**
     * 根据 appCode 查询标签分类列表
     *
     * @param appCode 应用code
     * @return 标签列表
     */
    default List<Label> queryLabelSetBasedOnAppcodeList(String appCode) {
        LambdaQueryWrapper<Label> wrapper = Wrappers.lambdaQuery();
        if (appCode != null && !appCode.isEmpty()) {
            wrapper.eq(Label::getAppCode, appCode);
        } else {
            wrapper.eq(Label::getAppCode, Constants.APP_CODE);
        }
        wrapper.eq(Label::getType, 1);
        return selectList(wrapper);
    }

    /**
     * 分页查询标签列表
     *
     * @param request 请求参数
     * @return 分页结果
     */
    default Page<Label> queryLabelWithPage(LabelQueryRequest request) {
        LambdaQueryWrapper<Label> wrapper = Wrappers.lambdaQuery();
        if (!Objects.isNull(request.getType()) && !request.getType().isEmpty()) {
            wrapper.eq(Label::getType, request.getType());
        }
        if (!Objects.isNull(request.getParentId())) {
            wrapper.eq(Label::getParentId, request.getParentId());
        }
        if (!Objects.isNull(request.getName()) && !request.getName().isEmpty()) {
            wrapper.like(Label::getName, request.getName());
        }
        if (!Objects.isNull(request.getCode()) && !request.getCode().isEmpty()) {
            wrapper.eq(Label::getCode, request.getCode());
        }
        wrapper.orderByDesc(Label::getUpdatedTime);
        return selectPage(Page.of(request.getPage(), request.getPageSize()), wrapper);
    }

    /**
     * 根据标签id删除标签
     *
     * @param id      标签id
     * @param handler 操作人
     */
    default void deleteByLabelId(Integer id, String handler) {
        update(null, Wrappers.lambdaUpdate(Label.class)
                .set(Label::getIfDeleted, 1)
                .set(Label::getModifier, handler)
                .eq(Label::getId, id));
    }

    /**
     * 根据标签code和应用code查询标签
     *
     * @param parentId 标签code
     * @param appCode  应用code
     * @return 标签
     */
    default Label findByCodeAndAppCode(Integer parentId, String appCode) {
        LambdaQueryWrapper<Label> wrapper = Wrappers.lambdaQuery();
        if (!Objects.isNull(parentId)) {
            wrapper.eq(Label::getParentId, parentId);
        }
        if (!Objects.isNull(appCode) && !appCode.isEmpty()) {
            wrapper.eq(Label::getAppCode, appCode);
        }
        wrapper.eq(Label::getIfDeleted, 0);
        wrapper.last("LIMIT 1");
        return selectOne(wrapper);
    }

    /**
     * 根据应用code查询标签
     *
     * @param code 应用code
     * @return 标签
     */
    default List<LabelExportVO> findLabelsByAppCode(String code) {
        List<Label> labels = selectList(Wrappers.lambdaQuery(Label.class).eq(Label::getAppCode, code));
        return LabelConverter.fromLabelList(labels);
    }
}
